/**
 * 【面试题】数组转树形结构 - 递归实现
 */

// 测试数据
const flatArray = [
  { id: 1, name: '部门1', parentId: null },
  { id: 2, name: '部门2', parentId: 1 },
  { id: 3, name: '部门3', parentId: 1 },
  { id: 4, name: '部门4', parentId: 2 },
  { id: 5, name: '部门5', parentId: 2 },
  { id: 6, name: '部门6', parentId: 3 },
  { id: 7, name: '部门7', parentId: null },
  { id: 8, name: '部门8', parentId: 7 },
];

// 递归实现
function arrayToTree(arr, parentId = null) {
  // 在这里实现
  let result = []
  for(let i = 0;i<arr.length;i++){
    let item = arr[i]
    if(item.parentId === parentId){
      let children = arrayToTree(arr,item.id)
      if(children.length>0){
        item.children = children
      }
      result.push(item)
    }
  }
  return result
}

// 测试
console.log('====== 数组转树 ======');
console.log(JSON.stringify(arrayToTree(flatArray), null, 2));

// ==========================================

/**
 * 【面试题】树转数组 - 递归实现
 */

// 测试数据（树形结构）
const treeData = [
  {
    id: 1,
    name: '部门1',
    parentId: null,
    children: [
      {
        id: 2,
        name: '部门2',
        parentId: 1,
        children: [
          { id: 4, name: '部门4', parentId: 2, children: [] },
          { id: 5, name: '部门5', parentId: 2, children: [] }
        ]
      },
      {
        id: 3,
        name: '部门3',
        parentId: 1,
        children: [
          { id: 6, name: '部门6', parentId: 3, children: [] }
        ]
      }
    ]
  },
  {
    id: 7,
    name: '部门7',
    parentId: null,
    children: [
      { id: 8, name: '部门8', parentId: 7, children: [] }
    ]
  }
];

// 递归实现
function treeToArray(tree) {
  // 在这里实现
  let result = []
  for(let i =0;i<tree.length;i++){
    let item = tree[i]
    result.push({
      id:item.id,
      parentId:item.parentId,
      name:item.name
    })
    if(item.children.length>0){
      let children = treeToArray(item.children)
      result = [...result,...children]
    }
  }
  return result
}

// 测试
console.log('\n====== 树转数组 ======');
console.log(JSON.stringify(treeToArray(treeData), null, 2));

// ==========================================

/**
 * 【面试题】数组求和系列
 */

console.log('\n====== 数组求和系列 ======');

// 题目1：简单数组求和
const numbers1 = [1, 2, 3, 4, 5];
// 期望输出：15

function sum1(arr) {
  // 在这里实现
}

console.log('题目1 - 简单求和:', sum1(numbers1));

// -------------------

// 题目2：对象数组求和（求所有商品的总价）
const products = [
  { name: '苹果', price: 5 },
  { name: '香蕉', price: 3 },
  { name: '橙子', price: 4 },
  { name: '西瓜', price: 10 }
];
// 期望输出：22

function sumPrice(arr) {
  // 在这里实现
}

console.log('题目2 - 对象数组求和:', sumPrice(products));

// -------------------

// 题目3：条件求和（求所有及格分数的总和）
const scores = [45, 78, 92, 55, 88, 33, 67, 99];
// 期望输出：424（只计算>=60的分数：78+92+88+67+99）

function sumPassScore(arr) {
  // 在这里实现
}

console.log('题目3 - 条件求和(>=60):', sumPassScore(scores));

// -------------------

// 题目4：嵌套数组求和（二维数组求和）
const matrix = [
  [1, 2, 3],
  [4, 5, 6],
  [7, 8, 9]
];
// 期望输出：45

function sumMatrix(arr) {
  // 在这里实现
}

console.log('题目4 - 二维数组求和:', sumMatrix(matrix));

// -------------------

// 题目5：购物车总价（数量 × 单价）
const cart = [
  { name: '手机', price: 3999, quantity: 2 },
  { name: '耳机', price: 299, quantity: 1 },
  { name: '充电器', price: 99, quantity: 3 }
];
// 期望输出：8594（3999*2 + 299*1 + 99*3）

function sumCartTotal(arr) {
  // 在这里实现
}

console.log('题目5 - 购物车总价:', sumCartTotal(cart));

// ==========================================

/**
 * 【面试题】数组求平均值系列
 */

console.log('\n====== 数组求平均值系列 ======');

// 题目6：简单平均值
const numbers2 = [10, 20, 30, 40, 50];
// 期望输出：30

function average1(arr) {
  // 在这里实现
}

console.log('题目6 - 简单平均值:', average1(numbers2));

// -------------------

// 题目7：对象数组平均值（求平均分）
const students = [
  { name: '张三', score: 85 },
  { name: '李四', score: 92 },
  { name: '王五', score: 78 },
  { name: '赵六', score: 88 }
];
// 期望输出：85.75

function averageScore(arr) {
  // 在这里实现
}

console.log('题目7 - 平均分:', averageScore(students));

// -------------------

// 题目8：去掉最高分和最低分后求平均（体操评分规则）
const judgeScores = [9.5, 9.8, 9.2, 9.7, 9.9, 9.3, 9.6];
// 期望输出：9.56（去掉9.9和9.2，剩余的平均值）

function averageWithoutExtremes(arr) {
  // 在这里实现
}

console.log('题目8 - 去极值平均:', averageWithoutExtremes(judgeScores));

// -------------------

// 题目9：加权平均值（成绩按权重计算）
const grades = [
  { subject: '语文', score: 85, weight: 0.3 },
  { subject: '数学', score: 90, weight: 0.3 },
  { subject: '英语', score: 88, weight: 0.2 },
  { subject: '体育', score: 95, weight: 0.2 }
];
// 期望输出：88.9（85*0.3 + 90*0.3 + 88*0.2 + 95*0.2）

function weightedAverage(arr) {
  // 在这里实现
}

console.log('题目9 - 加权平均:', weightedAverage(grades));

// -------------------

// 题目10：分组平均（按部门求平均工资）
const employees = [
  { name: '张三', department: '技术部', salary: 8000 },
  { name: '李四', department: '技术部', salary: 12000 },
  { name: '王五', department: '销售部', salary: 6000 },
  { name: '赵六', department: '销售部', salary: 7000 },
  { name: '孙七', department: '技术部', salary: 10000 }
];
// 期望输出：{ '技术部': 10000, '销售部': 6500 }

function averageByDepartment(arr) {
  // 在这里实现
}

console.log('题目10 - 分组平均:', averageByDepartment(employees));
